package com.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import oracle.jdbc.OracleTypes;

import com.exception.DAOExcepcion;
import com.modelo.Servicio;
import com.util.ConexionBD;

public class ServicioDAO extends BaseDAO {

	public Servicio insertarServicio(Servicio servicio) throws DAOExcepcion {
		System.err.println("Dentro de InsertarServicio...");
		String query = null;
		Connection con = null;
		CallableStatement stmt = null;
		ResultSet rs = null;
		try {
			query = "{call insert_servicio_package.insert_servicio(?,?,?,?,?,?)}";
			con = ConexionBD.obtenerConexion();
			// stmt = con.prepareStatement(query);
			System.out
					.println(servicio.getCodigo() + " - "
							+ servicio.getNombre() + " - "
							+ servicio.getIdentificador() + " - "
							+ servicio.getGruposervicio() + " - "
							+ servicio.getRutaservicio() + " - "
							+ servicio.getEstado());
			stmt = con.prepareCall(query);
			stmt.setObject(1, servicio.getCodigo());
			stmt.setString(2, servicio.getNombre());
			stmt.setString(3, servicio.getIdentificador());
			stmt.setObject(4, servicio.getGruposervicio());
			stmt.setString(5, servicio.getRutaservicio());
			stmt.setObject(6, servicio.getEstado());
			stmt.execute();
			System.out.println(stmt.getResultSet());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			} else {
				System.out
						.println("Se inserto la nueva fila correctamente....");
				System.out.println(servicio.getCodigo() + " - "
						+ servicio.getNombre() + " - "
						+ servicio.getIdentificador() + " - "
						+ servicio.getGruposervicio() + " - "
						+ servicio.getRutaservicio() + " - "
						+ servicio.getEstado());
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			// this.cerrarStatement(stmt);
			this.cerrarCallable(stmt);
			this.cerrarConexion(con);
		}
		return servicio;
	}

	// //obtener Lista de la tabla Servicio
	public Collection<Servicio> listarServicio() throws DAOExcepcion {
		Collection<Servicio> lista = new ArrayList<Servicio>();
		Connection con = null;
		// PreparedStatement stmt = null;
		CallableStatement stmt = null;// Procedure
		ResultSet rs = null;
		try {
			String query = "{?=call PKG_MANTSERVICIO.get_servicio_ref_cursor}";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareCall(query);
			stmt.registerOutParameter(1, OracleTypes.CURSOR);
			stmt.execute();// me extrae los datos de tabla Servico x
			rs = (ResultSet) stmt.getObject(1);
			while (rs.next()) {// Aqui se llena los datos en el objeto

				Servicio servicio = new Servicio();
				servicio.setCodigo(rs.getString("CODIGO"));
				servicio.setNombre(rs.getString("NOMBRE"));
				servicio.setIdentificador(rs.getString("IDENTIFICADOR"));
				servicio.setGruposervicio(rs.getString("GRUPOSERVICIO"));
				servicio.setRutaservicio(rs.getString("RUTASERVICIO"));
				servicio.setEstado(rs.getString("ESTADO"));

				lista.add(servicio);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			// this.cerrarStatement(stmt);
			this.cerrarCallable(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	// Actualizar La Tabla Servico

	public Servicio actualizarServicio(Servicio servicio) throws DAOExcepcion {
		String query = "{call update_servicio_package.update_servicio(?,?,?,?,?,?)}";
		Connection con = null;
		// PreparedStatement stmt = null;
		CallableStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			// stmt = con.prepareStatement(query);
			stmt = con.prepareCall(query);
			stmt.setString(1, servicio.getCodigo());
			stmt.setString(2, servicio.getNombre());
			stmt.setString(3, servicio.getIdentificador());
			stmt.setObject(4, servicio.getGruposervicio());
			stmt.setString(5, servicio.getRutaservicio());
			stmt.setObject(6, servicio.getEstado());
			stmt.executeUpdate();

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			} else {
				System.out.println("Se Actualizo correctamente....");
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			// this.cerrarStatement(stmt);
			this.cerrarCallable(stmt);
			this.cerrarConexion(con);
		}
		return servicio;
	}

	// Obtiene el Usuario deacuerdo al ID
	public Servicio obtenerServicio(String codigo) throws DAOExcepcion {
		Servicio servicio = new Servicio();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT CODIGO,NOMBRE,IDENTIFICADOR,"
					+ "GRUPOSERVICIO,RUTASERVICIO,ESTADO "
					+ "FROM servicio WHERE CODIGO=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, codigo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				servicio.setCodigo(rs.getString(1));
				servicio.setNombre(rs.getString(2));
				servicio.setIdentificador(rs.getString(3));
				servicio.setGruposervicio(rs.getString(4));
				servicio.setRutaservicio(rs.getString(5));
				servicio.setEstado(rs.getString(6));

			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.err.println(servicio.getNombre() + "-" + servicio.getCodigo());
		return servicio;
	}

}
